// Promise 相当于异步操作结果的占位符

// 承诺：未来某一时刻完成
// const promise = readFile('anc.txt')

// -------------------------------------------
// 生命周期

// 首先，处于进行中（pending）,由于操作未完成，同时也是未处理状态（unsetter）
// 一旦结束，Promise则变为已处理状态
//     1. Fulfilled,异步操作完成
//     2. Rejected，由于程序错误或者其他原因，异步操作未完成

//  内部属性 [[PromiseState]] 状态： pending \ fulfilled \ rejected
// 该属性不会暴露在 Promise 对象上，所以无法坚持状态
// 外抛 then 方法会根据 Promise 状态改变执行响应的操作

// 如果一个对象实现 then 方法，则可以称为 thenable 对象
// thenable对象 不一定是 Promise 对象
// Promise对象 一定是    thenable 对象

// then 参数可选（fulfilledFn 和 rejectedFn），即可组合使用
// const promise = readFile('abc.txt')

// promise.then((result) => {
//   console.log(result)
// }).catch((err) => {
//   console.log(err)
// });

// promise.then((res) => { console.log(res) })
// promise.catch((err) => { console.error(err) })

// 3次的关注点不一样

// promise 一旦转变为 已处理，这后续都会直接使用已执行的程序

const promise = new Promise((res, rej) => {
  setTimeout(() => { res(123) }, 2000)
})

promise.then(() => {
  console.log(2)

  promise.then(() => {
    console.log(3)
  })

  console.log(4)
})

console.log(1)

// --------------------------------------------------------
// Promise 构造器直接受一个参数,包含 初始化Promise对象的执行器函数
// (res, rej)
